package com.rt.gptnext.common.bean;

import cn.hutool.core.lang.func.Func1;
import cn.hutool.core.lang.func.LambdaUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.rt.gptnext.common.constant.Constants;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 分页查询条件
 *
 * @author gaoyiyang
 **/
@Data
@EqualsAndHashCode(callSuper = true)
public class PagingQuery extends Query {

    private int current = 1;

    private int size = 10;

    public <T> Page<T> toPage(Class<T> clazz) {
        Page<T> page = new Page<>(current, size);
        if (getDesc() != null) {
            List<OrderItem> cols = StrUtil.split(getDesc(), Constants.COMMA)
                    .stream()
                    .filter(col -> ReflectUtil.getField(clazz, col) != null)
                    .map(StrUtil::toUnderlineCase)
                    .map(col -> new OrderItem(col, false))
                    .collect(Collectors.toList());
            page.addOrder(cols);
        }
        if (getAsc() != null) {
            List<OrderItem> cols = StrUtil.split(getAsc(), Constants.COMMA)
                    .stream()
                    .filter(col -> ReflectUtil.getField(clazz, col) != null)
                    .map(StrUtil::toUnderlineCase)
                    .map(col -> new OrderItem(col, true))
                    .collect(Collectors.toList());
            page.addOrder(cols);
        }
        return page;
    }

    /**
     * 返回mp分页对象并添加默认排序（当asc、desc都为空时使用默认排序）
     *
     * @param clazz 分页实体
     * @param col   默认desc排序字段
     * @return mp分页对象
     */
    public final <T> Page<T> toPageDesc(Class<T> clazz, Func1<T, ?> col) {
        String fieldName = LambdaUtil.getFieldName(col);
        return toPageDesc(clazz, StrUtil.toUnderlineCase(fieldName));
    }

    /**
     * 返回mp分页对象并添加默认排序（当asc、desc都为空时使用默认排序）
     *
     * @param clazz 分页实体
     * @param col   默认desc排序字段
     * @return mp分页对象
     */
    public final <T> Page<T> toPageDesc(Class<T> clazz, String col) {
        Page<T> page = toPage(clazz);
        if (StrUtil.isNotBlank(getDesc()) || StrUtil.isNotBlank(getAsc())) {
            return page;
        }
        page.addOrder(new OrderItem(col, false));
        return page;
    }

    /**
     * 返回mp分页对象并添加默认排序（当asc、desc都为空时使用默认排序）
     *
     * @param clazz 分页实体
     * @param col   默认asc排序字段
     * @return mp分页对象
     */
    public final <T> Page<T> toPageAsc(Class<T> clazz, Func1<T, ?> col) {
        String fieldName = LambdaUtil.getFieldName(col);
        return toPageAsc(clazz, StrUtil.toUnderlineCase(fieldName));
    }

    /**
     * 返回mp分页对象并添加默认排序（当asc、desc都为空时使用默认排序）
     *
     * @param clazz 分页实体
     * @param col   默认asc排序字段
     * @return mp分页对象
     */
    public final <T> Page<T> toPageAsc(Class<T> clazz, String col) {
        Page<T> page = toPage(clazz);
        if (StrUtil.isNotBlank(getDesc()) || StrUtil.isNotBlank(getAsc())) {
            return page;
        }
        page.addOrder(new OrderItem(col, true));
        return page;
    }

}
